package cn.maxwell.service.impl;

import cn.maxwell.domain.MovieTicket;
import cn.maxwell.dto.ByTicketDto;
import cn.maxwell.enums.GlobalErrorCode;
import cn.maxwell.exception.GlobalCustomException;
import cn.maxwell.mapper.MovieTicketMapper;
import cn.maxwell.result.JsonResult;
import cn.maxwell.service.IMovieTicketService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;


/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author maxwell
 * @since 2022-08-29
 *
 * 电影服务：提供电影票查询、电影票购买、电影观看controller接口，提示：需要集成mybatis查询数据库
 *
 * - 电影票查询：查询所有电影票信息并返回
 * - 电影票购买根据Id进行购买，购买前判断库存是否足够，如果不足响应提示，购买需要保存用户、电影票中间表，以及是否使用状态
 * - 根据电影Id，查询用户是否拥有此电影票，电影票是否过期，过期提示不可观看
 *
 */
@Service
public class MovieTicketServiceImpl extends ServiceImpl<MovieTicketMapper, MovieTicket> implements IMovieTicketService {

    @Autowired
    private MovieTicketMapper movieTicketMapper;

    /**
     * 购买电影票
     * 所需参数：用户id，电影id
     * 查看中间表数据
     * 添加中间表数据
     * 电影票库存减一
     * @param id
     * @param userId
     */
    @Override
    public JsonResult byMovieTicket(Long id, Long userId,Integer count) {
        //查询库存，库存不足的话抛出错误信息
        MovieTicket movieTicket = movieTicketMapper.selectById(id);
        if(movieTicket.getStock() < 1){
            throw new GlobalCustomException(GlobalErrorCode.MOVIE_SOCKET_NULL);
        }
        //查询中间表
        ByTicketDto byTicketDto = movieTicketMapper.selectByUserIdAndMovieId(id, userId, count);
        //如果中间表没有信息，说明用户是第一次购买，就新增数据
        if(byTicketDto == null){
            //添加信息
            byTicketDto.setUserId(id);
            byTicketDto.setUserId(userId);
            byTicketDto.setCount(count);
            movieTicketMapper.insertUserTicket(byTicketDto);
        }else { //如果中间标有数据，就修改购票数量
            //修改信息
            //中间表的电影票数量加上传入的（也就是购买的）电影票数量
            byTicketDto.setCount(byTicketDto.getCount()+count);
            movieTicketMapper.updateUserTicket(byTicketDto);
        }
        //电影票库存做出相对应的增减
        movieTicket.setStock(movieTicket.getStock()-count);
        //及时更新电影票表，保持库存数据一致
        movieTicketMapper.updateById(movieTicket);
        //返回电影票价，方便后面使用
        return JsonResult.success(movieTicket.getPrice());
    }

    /**
     * 电影票观看
     * 所需参数：userId:用户id/id:电影票id
     * @param id
     * @param userId
     */
    @Override
    public JsonResult seeMovie(Long id, Long userId) {
        Date date = new Date();
        //查询出要观看的电影票信息，是电影票信息，稍后会判断观看时间
        MovieTicket movie = movieTicketMapper.selectById(id);
        if(movie.getEndTime().getTime() < date.getTime()){
            throw new GlobalCustomException(GlobalErrorCode.MOVIE_EXPIRED);
        }
        //查询中间表
        ByTicketDto byTicketDto = movieTicketMapper.selectByUserIdAndMovieId2(id, userId);
        //防御性编程：（在自己觉得不判空就可能会发生异常的地方进行判空）
        if(byTicketDto == null){
            throw new GlobalCustomException(GlobalErrorCode.MOVIE_MESSAGE_NULL);
        }
        if(byTicketDto.getCount() < 1){
            throw new GlobalCustomException(GlobalErrorCode.MOVIE_MESSAGE_NULL);
        }
        //观看：电影票减一，并更新数据库
        byTicketDto.setCount(byTicketDto.getCount()-1);
        movieTicketMapper.updateUserTicket(byTicketDto);
        return JsonResult.success("祝您观影愉快","200");
    }
}
